// var -> variable
// var a = 5
// console.log(a)
// // delete a
// console.log(window.a)


// b = 6
// console.log(b)
// // delete b
// console.log(window.b)

// let a = 5
// console.log(a)
// console.log(window.a)

// let a = 5
// let a = 6
// console.log(a)

// console.log(a)
// var a = 5

// var a
// console.log(a)
// a = 5

// console.log(a)
// let a = 5

// var a = 5
// if (true) {
//     a = 6
//     let a
// }

// function foo(a = 2, b = a){
//     console.log(a, b)
// }
// foo()

// for (let i = 0; i < 3; i++) {
//     console.log('循环内:' + i)
// }
// console.log('循环外:' + i)

// if (false) {
//     let a = 5
// }
// console.log(a)

// if (true) {
//     let a = 5
// }


// for (var i = 0; i < 3; i++) {
//     (function(j){
//         setTimeout(function(){
//             console.log(j)
//         })
//     })(i)
// }
// for (let i = 0; i < 3; i++) {
//     setTimeout(function () {
//         console.log(i)
//     })
// }
//
// var y = 3
//
// function A() {
//     var x = 2
//
//     function B() {
//         return x * y
//     }
//
//     return B()
// }
//
// console.log(A());

// var a = 5
// var a = 6
// console.log(a)

// function Foo() {
//     getName = function () { alert (1); };
//     return this;
// }
// Foo.getName = function () { alert (2);};
// Foo.prototype.getName = function () { alert (3);};
// var getName = function () { alert (4);};
// function getName() { alert (5);}
//
// Foo.getName();
// getName();
// Foo().getName();
// getName();
// new Foo.getName();
// new Foo().getName();
// new new Foo().getName();

// 2 4 1 1 2 3 3

// let test = {
//     name:"小红"
// }
// test = new Proxy(test,{
//     get(target,key){
//         target[key] = '小李'
//         return target[key]
//     }
// })
// console.log(test.name)

// 节流函数，限制函数在指定时间段只能被调用一次
// 用法：比如防止用户连续执行一个耗时操作  对操作按钮点击函数进行节流处理
function throttle(func, wait) {
    let timer = null
    return function (...args) {
        if (!timer) {
            func(...args)
            timer = setTimeout(() => {
                timer = null
            }, wait)
        }
    }
}
//防抖
// 函数调用后不会立即执行，之后连续wait时间没有调用才会执行
// 用法：处理用户输入
function debounce(func,wait) {
    let timer = null
    return function (...args) {
        if(timer) clearTimeout(timer)
        timer = setTimeout(()=>{
            func(...args)
        },wait)
    }
}

let foo = {
    value: 1
};
function bar() {
    console.log(this.value);
}
bar.call(foo); // 1













